package ar.com.ctrln.view.dashboard.mantenimiento.factibilidad;

import java.util.HashSet;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.mantenimiento.factibilidad.ConsultarRequerimiento;
import ar.com.ctrln.persistence.model.factibilidad.DetalleFactibilidad;
import ar.com.ctrln.persistence.model.factibilidad.Requerimiento;
import ar.com.ctrln.persistence.model.insumo.Insumo;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class AgregarRequerimientoController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 4036436023323801440L;

	@WireVariable
	private ConsultarRequerimiento consultarRequerimiento;

	@Wire
	private Window wAgregarRequerimiento;

	@Wire
	private Listbox lbRequerimiento;

	@Wire
	private Button btnAgregarInsumo;

	@Wire
	private Button btnQuitarInsumo;

	@Wire
	private Button btnGuardar;

	@Wire
	private Label txtServicio;

	@Wire
	private Spinner spinner;

	@Wire
	private Label txtTipoServicio;

	private ListModelList<Requerimiento> modelo;

	private Set<Requerimiento> requerimientos;

	private Set<Insumo> seleccion;

	private DetalleFactibilidad detalle;

	@Wire
	private Textbox tbObservaciones;

	@SuppressWarnings("rawtypes")
	private EventQueue agregarInsumos;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		detalle = (DetalleFactibilidad) this.getSelf().getParent()
				.getAttribute("detalle");

		txtTipoServicio.setValue(detalle.getTipoServicio().getNombre());

		tbObservaciones.setText(detalle.getObservacion() != null ? detalle
				.getObservacion() : "");

		requerimientos = new HashSet<Requerimiento>();

		modelo = new ListModelList<Requerimiento>();

		agregarInsumos = EventQueues.lookup("SeleccionarInsumos",
				EventQueues.DESKTOP, true);
		agregarInsumos.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				seleccion = (Set<Insumo>) event.getData();
				Requerimiento requerimiento;
				for (Insumo i : seleccion) {
					requerimiento = new Requerimiento();
					requerimiento.setServicioProveedor(i.getNombre());
					requerimiento.setCantidad(1);
					requerimiento.setDetalle(detalle);
					requerimiento.setInsumos(i);
					requerimientos.add(requerimiento);
				}
				requerimientos.addAll(modelo.getInnerList());
				modelo.clear();
				modelo.addAll(requerimientos);

				detalle.setRequerimientos(requerimientos);

			}
		});

		if (null != detalle.getRequerimientos()
				&& !detalle.getRequerimientos().isEmpty()) {
			modelo.addAll(detalle.getRequerimientos());

			lbRequerimiento.setModel(modelo);
		} else {

			for (Requerimiento requerimiento : consultarRequerimiento
					.listar(detalle.getId())) {
				requerimientos.add(requerimiento);
			}

			modelo.addAll(requerimientos);

			lbRequerimiento.setModel(modelo);
		}

	}

	@Listen("onClick = #btnGuardar")
	public void guardarRequerimiento() {

		if (tbObservaciones.getText() != null) {
			detalle.setObservacion(tbObservaciones.getText());
		} else {
			detalle.setObservacion("");
		}
		EventQueue<Event> eq = EventQueues.lookup("guardarRequerimientos",
				EventQueues.DESKTOP, false);

		eq.publish(new Event("onButtonClick", btnGuardar, requerimientos));

		wAgregarRequerimiento.onClose();

	}

	@Listen("onClick = #btnAgregarInsumo")
	public void seleccionarInsumos() {
		Executions.createComponents(
				"/zul/mantenimiento/factibilidad/seleccionarInsumo.zul",
				wAgregarRequerimiento, null);
	}

	@Listen("onClick = #btnQuitarInsumo")
	public void quitarInsumo() {
		if (lbRequerimiento.getSelectedItem() != null) {
			requerimientos.remove(lbRequerimiento.getSelectedIndex());
			modelo.remove(lbRequerimiento.getSelectedIndex());
			requerimientos.remove(lbRequerimiento.getSelectedIndex());
		} else {
			Clients.showNotification("Debe seleccionar un Requerimiento",
					lbRequerimiento);
		}
	}

}
